package com.yifan.leetcode.dataStructure;

/**
 * @Author YIFan
 * @Date 2023-2-4 22:52
 * @Version 1.0
 *
 * <p>
 * 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
 * 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢？
 * <p>
 * 输入：n = 3
 * 输出：3
 * 解释：有三种方法可以爬到楼顶。
 * 1. 1 阶 + 1 阶 + 1 阶
 * 2. 1 阶 + 2 阶
 * 3. 2 阶 + 1 阶
 */
public class 爬楼梯 {
    public static void main(String[] args) {
        System.err.println(爬楼梯.climbStairs1(45));
    }
    /*
    * 1->  1
    * 2->  2
    * 3_>  3
    * 4->  5
    * fn = f(n-1) + f(n-2)
    * */
    public static int climbStairs(int n) {
        if (n == 1){
            return  1;
        }
        if (n == 2){
            return  2;
        }
        return  climbStairs(n-1) + climbStairs(n-2);
    }
    /*动态规划 解决 参考了官方解答*/
    public static int climbStairs1(int n) {
        int[] i = new int[n+1];
        i[0] = 1;
        i[1] = 2;
        for (int j = 2; j < n; j++) {
            i[j] = i[j-1] + i[j-2];
        }
        return i[n-1];
    }
}
